metadata 被用來控制編譯的過程,可以區分為兩種類型:
變數 : 被賦值 or 有表達式的
可執行的資料 : 具有函數or任務的檔案
這兩種metadata又可以構成五類檔案 , 關係如下:
放在設定文件當中的所有 metadata 都是 global
的 , 通常只會包含各種變數而已。
假如有相同的變數在多個設定文件當中被賦值,會有優先權決定哪個生效。
🪄 bitbake.conf 最低優先權 , build/conf具有最高的優先權
recipe 當中有說明特定軟件包與編譯用的 metadata , 通常 recipe 當中的 metadata 是 Task 形式 (do_install() )用於下載、解壓縮、打patch 等等。
類文件提供了讓 recipe 可以繼承來自不同 recipe 的指令。 BitBake 會在 layer 當中的classes搜尋類文件, recipe 可以透過inherit
指令, 用 類文件的名稱來引用類文件。
# custom_tasks.bbclass --> 會在 classes 資料夾底下
# 定義一個函數用來配置
do_custom_configure() {
echo "Custom configuration tasks..."
# 可以在這裡執行特定的配置任務,ex 設置環境變數 or 複製配置文件等等
}
# 定義一個函數用於編譯
do_custom_compile() {
echo "Custom compilation tasks..."
# 可以在這裡執行編譯相關的任務,編譯 source code 等等
}
# 定義一個變數用來指定安裝目錄
CUSTOM_INSTALL_DIR = "${D}/opt/myapp"
# myapp.bb --> 這是一個 recipe 的檔案
SUMMARY = "範例應用程式"
LICENSE = "MIT"
SRC_URI = "git://example.com/myapp.git"
# 引用 custom_tasks 類別 (classes 的繼承概念)
inherit custom_tasks
# 指定配置階段
do_configure() {
# 呼叫 custom_tasks 類別中的配置函式
do_custom_configure
}
# 指定編譯任務
do_compile() {
# 呼叫 custom_tasks 類別中的編譯函式
do_custom_compile
}
# 指定安裝路徑
FILES_${PN} += "${CUSTOM_INSTALL_DIR}"
追加文件(.bbappend
)是用於擴展recipe文件的概念。通常,這些文件用於在不修改原始recipe的情況下擴展或修改其他層中的recipe。.bbappend
文件必須具有與它所擴展的recipe相同的基本名稱,但後綴為 .bbappend
而不是 .bb
。此外,.bbappend
文件的相對於層根目錄的路徑必須與它所擴展的recipe相同。
meta-example/
├── recipes-example/
│ └── recipes-myapp/
│ ├── myrecipe.bb # 原始recipe文件
│ └── myrecipe.bbappend # 擴展recipe文件
# myapp.bb --> recipe 文件
SUMMARY = "範例應用程式"
LICENSE = "MIT"
SRC_URI = "git://example.com/myapp.git"
do_install() {
install -d ${D}/usr/bin
install -m 0755 ${S}/myapp ${D}/usr/bin/
}
假如希望在不修改 myapp.bb 的情況下,添加一些額外的操作,比如增加一個啟動腳本。我們可以創建一個 myapp.bbappend 文件來實現這一點:
# myapp.bbappend
# 設置了一個額外的文件搜索路徑,以便在 SRC_URI 中引用 myapp-start.sh。
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
# SRC_URI_append 將 myapp-start.sh 腳本添加到原始 SRC_URI 中。
SRC_URI_append = " file://myapp-start.sh"
# do_install_append() 函數將安裝 myapp-start.sh 腳本到 ${D}/etc/init.d 目錄下。
do_install_append() { # _append 表示追加函數
# 這些install 會追加到原先函數後面運行 , 不會覆蓋掉。
install -d ${D}/etc/init.d
install -m 0755 ${WORKDIR}/myapp-start.sh ${D}/etc/init.d/
}
在 Yocto Project 中,.inc
文件用於包含和共享元數據,這些文件通常提供多個元數據文件共享的功能。透過使用 include
和 require
指令,可以將一個 .inc
文件包含到另一個元數據文件(如 .bb
或 .bbappend
文件)中。
# custom_functions.inc --> 這是一個 .inc 檔案
# 自定義函數
custom_do_something() {
echo "Doing something custom..."
}
# 自定義變數
CUSTOM_VAR = "custom_value"
我們可以在一個 .bb
或 .bbappend
文件中,可以使用 include
指令來引入 custom_functions.inc
中的功能:
# myapp.bbappend
# 引入 custom_functions.inc 文件
include custom_functions.inc
# 在 do_install 函數中使用自定義函數
do_install() {
custom_do_something # inc 文件中的函數 不用加上 ()
echo "The value of CUSTOM_VAR is ${CUSTOM_VAR}"
install -d ${D}/usr/bin
install -m 0755 ${S}/myapp ${D}/usr/bin/
}
變數/縮寫 | 描述和用途 |
---|---|
${PN} | 軟體包名稱(Package Name),表示目前 BitBake recipe 定義的軟體包名稱。例如,如果 recipe 名稱為 myapp.bb,則 ${PN} 將是 myapp。 |
${D} | 構建臨時目錄(Build Directory),表示目前軟體包在構建過程中的臨時目錄。在 ${D} 下可以找到所有構建生成的檔案和目錄。 |
${S} | 源碼目錄(Source Directory),表示軟體包源碼的存放目錄。 |
${WORKDIR} | 工作目錄(Working Directory),表示 BitBake 在構建過程中使用的工作目錄,通常是 ${TMPDIR}/work/${MULTIMACH_TARGET_SYS}/${PN}/${EXTENDPE}${PV}-${PR}。 |
${TMPDIR} | 臨時目錄(Temporary Directory),表示 BitBake 在構建過程中使用的頂層臨時目錄。 |
${PKG} | 打包目錄(Package Directory),表示軟體包安裝的臨時目錄,用於打包成部署包。 |
${PF} | 軟體包完整名稱(Package Full Name),結合 ${PN}、-${PV} 和 -${PR},表示軟體包的完整版本。 |
${PN}-${PV} | 完整軟體包版本(Package Name-Version),表示軟體包的名稱和版本號的組合。 |
${PN}-${PV}-${PR} | 完整軟體包版本和修訂號(Package Name-Version-Revision),表示軟體包的名稱、版本號和修訂號的組合。 |
🪄 數字權限表示法:在 Linux 和 Unix 系統中,檔案和目錄的權限用一個三位的八進位數字來表示。每個數字代表了不同的權限位。
每一位權限可以用以下方式表示:
因此,不同的數字組合代表不同的權限設置。例如:
這樣設置權限意味著:
BitBake 編譯流程
調用 BitBake 命令 → 找尋 build/conf/local.conf / 找尋 build/conf/bbla.conf → 依照設定檔找到 layer → 進入layer/conf/layer.conf → 找到設定的recipe/class/config
.bbclass 可以寫成一個類別 其中的函數 變數 ,可以透過 inherit
指令來讓其他 recipe 繼承。
.inc 檔可以理解為 include 的 header 檔 , 透過 include custom.inc
和 require custom.inc
指令來引用。